package test

import (
	"fmt"
	"ginchat/models"
	"github.com/spf13/viper"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"gorm.io/gorm/schema"
)

// InitConfig 初始化项目配置信息
func InitConfig() {
	viper.SetConfigName("app")    // 读取的配置文件名
	viper.AddConfigPath("config") // 读取的配置目录
	err := viper.ReadInConfig()
	if err != nil {
		fmt.Println("读取viper错误", err)
	}
}

var MySqlDB *gorm.DB
var MysqlErr error

// YmlTestDb 使用yml配置文件调用
func YmlTestDb() {
	InitConfig()
	dns := viper.GetString("mysql.dns")
	MySqlDB, MysqlErr = gorm.Open(mysql.Open(dns), &gorm.Config{
		// gorm日志模式：silent
		//Logger: logger.Default.LogMode(logger.Silent), 不显示SQL
		Logger: logger.Default.LogMode(logger.Info), // 显示所有SQL
		// 外键约束
		DisableForeignKeyConstraintWhenMigrating: true,
		// 禁用默认事务（提高运行速度）
		SkipDefaultTransaction: true,
		NamingStrategy: schema.NamingStrategy{
			// 使用单数表名，启用该选项，此时，`User` 的表名应该是 `user`
			SingularTable: true,
		},
	})
	if MysqlErr != nil {
		fmt.Println("初始化MySQL失败", MysqlErr)
	}

	// 迁移 schema // 设置MySQL数据格式为utf8才能使用中文
	err := MySqlDB.Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8").AutoMigrate(&models.UserBasic{})
	if err != nil {
		return
	}

	MySqlDB.Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8") // 设置MySQL数据格式为utf8
	newTable()
}

func newTable() {
	// 创建数据
	u := &models.UserBasic{
		Name:          "李四",
		PassWord:      "45454",
		Phone:         "1864000",
		Email:         "q@11.com",
		ClientIp:      "127.0.0.1",
		ClientPort:    "8080",
		LoginTime:     16360000000,
		HeartbeatTime: 16360000000,
		LogOutTime:    16360000000,
	}
	MySqlDB.Create(&u)
}

// TestDb 普通写法调用db -- 测试ok
func TestDb() {
	dsn := "root:123456@tcp(127.0.0.1:3306)/gin_chat?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic("failed to connect database")
	}
	// 迁移 schema // 设置MySQL数据格式为utf8才能使用中文
	err = db.Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8").AutoMigrate(&models.UserBasic{})
	if err != nil {
		return
	}
	// 创建数据
	u := &models.UserBasic{
		Name:          "张三",
		PassWord:      "45454",
		Phone:         "1864000",
		Email:         "q@11.com",
		ClientIp:      "127.0.0.1",
		ClientPort:    "8080",
		LoginTime:     16360000000,
		HeartbeatTime: 16360000000,
		LogOutTime:    16360000000,
	}
	db.Create(&u)
}
